<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="text-css.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>

<body>
<div  class="box" style="display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;
">
    <h1><a href="equip-http-add-0" >设备数据HTTP方式推送</a></h1>
    <p>更新时间：2018-12-21 13:28:08</p>
    <p>
        设备数据（如设备状态数据、设备控制记录等），我们更推荐使用HTTP/2的方式推送，推送颗粒度可以细化到项目和产品，查看 设备数据HTTP/2方式推送；<br>
        用户数据（如用户绑定、解绑数据等），我们推荐使用本文描述的HTTP的方式推送，会对所有数据全局推送，不区分项目或产品。具体方式请见下文：
    </p>
    <h1><a name="equip-http-add-1">1. 接入方式</a></h1><br>
    <p>

智能语音服务平台支持使用HTTP/HTTPS协议的**POST方法**，调用第三方云提供的URL接口，
实现实时上报设备相关数据。**说明：点击控制台-首页-右上角的“云端设置”，出现如图
所示的界面，在服务器地址一栏，填入URL(支持HTTP/HTTPS)，点击开启按钮，之后当有设备
相关数据产生时，平台会主动调用该URL接口进行实时数据推送。**
    </p>

    <p>接入示意图如下：</p>
    <img src="img/123_20190509204809.png" alt="" style="width:100%">
    <h1><a name="equip-http-add-2">2. 数据类型和字段</a></h1>
    <p>目前平台会默认推送五种消息，消息名称和消息字段类型如下所示：</p>
    <h2><a name="equip-http-add-2-1">2.1文本消息(device_text_post)</a></h2>
    <h3>消息字段说明：</h3>
    <table border="1" class="table table-striped table-bordered">
        <tr><th style="30%">参数</th><th style="width:10%">类型</th><th style="width:60%">含义</th></tr>
        <tr><td>deviceKey</td><td>String</td><td>设备的key值</td></tr>
        <tr><td>userId</td><td>String</td><td>用户的id</td></tr>
        <tr><td>test</td><td>String</td><td>设备上的文本消息</td></tr>
    </table>
    <h3>消息范例：</h3>
    <pre class="pre-box">

{
        "deviceKey":"test_device_key",
        "userId":"0300MSKL03667c544f69342a74Sv4Za4",
        "text":"设备上报文本"
}
    </pre>

    <h1><a name="equip-http-add-3">3. 接入教程</a></h1>
    <h2><a name="equip-http-add-3-1">3.1HTTP POST方法推送的数据体内容</a></h2>
    <ul style="margin:0">
        <li>message : 消息内容</li>
        <li>appKey : 线上环境Appkey</li>
        <li>topic : 消息名称(英文)</li>
        <li>sign : 生成的签名字符串</li>
    </ul>
    <p>备注：topic是第二部分消息的英文名称。</p>
    <h2><a name="equip-http-add-3-2">3.2加签和验签</a></h2>
    <p>为了保证推送数据的完整性，需要对数据进行加签，签名生成规则如下：</p>
    <ul style="margin:0">
        <li><h4>参与生成签名的参数</h4></li>
        <p>在请求参数列表中,除去sign参数外,其他需要使用到的参数皆是要参与签名的参数。我们这里参与签名的参数是appKey、message和topic。</p>
        <li><h4>生成待签名字符串</h4></li>
        <p> 例如appKey=xxx&message=xxx&topic=xxx, 这串字符串便是待签名的字符串。</p>
        <li><h4>使用MD5生成签名</h4></li>
        <p>在MD5签名时,需要appsecret参与签名。**其中appsecret需要与appKey是匹配的**。当得到待签名字符串后,需要把私钥直接拼接到待签名字符串后面,形成新的字符串,利用 MD5 的签名函数对这个新的字符串进行签名运算,从而得到 32 位签名结果字符串。例如：私钥为:291GSDFSK9023842KJSDJFSDS23849JS, 则sign=md5DigestAsHex(appKey=xxx&message=xxx&msgCode=xxx291GSDFSK9023842KJSDJFSDS23849JS)。</p>
        <li><h4>校验签名</h4></li>
        <p>当收到请求后,同理,需要把appsecret直接拼接到待签名字符串后面,形成新的字符串,利用 MD5 的签名函数对这个新的字符串进行签名运算, 从而得到 32 位签名结果字符串。此时这个签名结果字符串需要与请求参数中的参数 sign 的值进行验证是否相等,来判断签名是否验证通过。</p>
    </ul>
    <h2><a name="equip-http-add-3-3">3.3URL接口返回值</a></h2>
    <p>如果第三方云的URL接口正确收到推送的消息，期望返回的数据格式为：{"code":200,"message":"success","data":"OK"}，同时HTTP CODE为200。</p>
    <h2><a name="equip-http-add-3-4">3.4重试</a></h2>
    <p>如果URL接口未正确返回数据格式或HTTP CODE返回非200，那么平台会采用退避策略重新推送该消息，最多推送16次；具体重试策略如下：</p>
    <table border="1" class="table table-striped table-bordered">
        <tr><th style="width：20%">第几次重试</th><th style="width：30%">与上次的剪个时间</th><th style="width：20%">第几次重试</th><th style="width:30%">与上次重试的间隔时间</th></tr>
        <tr><td>1</td><td>10 秒</td><td>9</td><td>7 分钟</td></tr>
        <tr><td>2</td><td>30 秒</td><td>10</td><td>8 分钟</td></tr>
        <tr><td>3</td><td>1 分钟</td><td>11</td><td>9 分钟</td></tr>
        <tr><td>4</td><td>2 分钟</td><td>12</td><td>10 分钟</td></tr>
        <tr><td>5</td><td>3 分钟</td><td>13</td><td>20 分钟</td></tr>
        <tr><td>6</td><td>4 分钟</td><td>14</td><td>30 分钟</td></tr>
        <tr><td>7</td><td>5 分钟</td><td>15</td><td>1 小时</td></tr>
        <tr><td>8</td><td>6 分钟</td><td>16</td><td>2 小时</td></tr>
    </table>
    <p>如果消息重试 6 次后仍然失败，消息将不再推送。如果严格按照上述重试时间间隔计算，某条消息在一直推送失败的前提下，将会在接下来的 10分钟40秒（非严格计算）之内进行 6 次重试，超过这个时间范围消息将不再重试推送。</p>
</div>
<div id="intro-platform-nav" style="position:absolute;right:100px;top:150px;width:30px;height:30px;position:fixed;z-index:1;border:1px solid #CCC;box-shadow:4px 4px 10px #E8E8E8;border-radius:10px;background:#F5F5F5	">
    <img src="img\\sanheng.png" alt="" style="width:30px;height:30px;position:fixed;position:absolute;right:0px;top:0px;">
    <div  id="nav-text" style="display:none;line-height:15px;overflow:scroll;height:250px;overflow-x:hidden;padding-left:15px;margin-top:15px">
        <p><a href="#equip-http-add-0">设备数据HTTP方式推送</a></p>
        <p><a href="#equip-http-add-1">1.接入方式</a></p>
        <p><a href="#equip-http-add-2">2.数据类型和字段</a></p>
        <p><a href="#equip-http-add-2-1">2.1文本消息(device_text_post)</a></p>
        <p><a href="#equip-http-add-3">3.接入教程</a></p>
        <p><a href="#equip-http-add-3-1">3.1HTTP POST方法推送的数据体内容</a></p>
        <p><a href="#equip-http-add-3-2">3.2加签和验签</a></p>
        <p><a href="#equip-http-add-3-3">3.3.URL接口返回值</a></p>
        <p><a href="#equip-http-add-3-4">3.4.重试</a></p>
    </div>
</div>
</div>
</body>
<script src="jquery-3.3.1.min.js"></script>
<script>
    $(document).ready(function(){
      $("#intro-platform-nav").click(function(){
       $("#intro-platform-nav").animate({
            "width":"360px",
            "height":"250px"
       },600);
       $("#nav-text").css("display","");
    });
    $("#intro-platform-nav").mouseleave(function(){
      $("#intro-platform-nav").animate({
      "width":"30px",
      "height":"30px"
      },500);
      $("#nav-text").css("display","none");
    });
    $("tr:gt(1):even()").css("background","#F5F5F5");
   })
</script>

</html>